%     VIRTUAL SORIC - программа для получения эффективных свойств заполнителей SORIC
%     Copyright (C) 2020  Михаил Козлов
%     Сайт проекта: <http://www.fastenerdoctor.ru/>
%     Адрес электронной почты для связи с разработчиком:
%     <doctor.fastener@gmail.com>
% 
%     Эта программа является свободным программным обеспечением: Вы можете
%     распространять ее и/или изменять, соблюдая условия Универсальной общественной
%     лицензии GNU, опубликованной Фондом свободного программного обеспечения,
%     либо редакции 3, либо (на Ваше усмотрение) любой редакции, выпущенной позже.
% 
%     Эта программа распространяется в надежде на то, что она окажется полезной,
%     но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, включая даже подразумеваемую гарантию ТОВАРНОЙ ПРИГОДНОСТИ,
%     либо ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Ознакомьтесь с Универсальной общественной
%     лицензией GNU для получения более подробной информации.
% 
%     Вы должны были получить копию Универсальной общественной лицензии GNU
%     вместе с этой программой. Если Вы ее не получили, то перейдите по адресу:
%     <http://www.gnu.org/licenses/>.
% 
%     This program is free software: you can redistribute it and/or modify
%     it under the terms of the GNU General Public License as published by
%     the Free Software Foundation, either version 3 of the License, or
%     (at your option) any later version.
% 
%     This program is distributed in the hope that it will be useful,
%     but WITHOUT ANY WARRANTY; without even the implied warranty of
%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
%     GNU General Public License for more details.
% 
%     You should have received a copy of the GNU General Public License
%     along with this program.  If not, see <https://www.gnu.org/licenses/>.

function Results_Thermal = Read_Dat_File_Therm(Job_Name, Work_Directory, ELEMENTS, Coordinate_Systems)

global ErrCode;

Results_Thermal = [];

% Полный путь к файлу
File_Path = [Work_Directory '\' Job_Name '.dat'];

% Проверка существования файла
if (exist(File_Path, 'file') ~= 2)
    fprintf (1, '\nОшибка: программе не удалось найти файл [%s] !\n', File_Path);
    fprintf (1, 'Возможно, запуск Abaqus завершился неудачей.\n');
    fprintf (1, 'Проверьте файлы расчета с названием [%s] в рабочей папке Abaqus для выяснения причин данной ошибки.\n', Job_Name);
    ErrCode = -1;
    return;
end

% Открытие файла
Fin = fopen(File_Path, 'r');

% Проверка
if (Fin < 0)
    fprintf (1, '\nОшибка функции Read_Dat_File_Therm: не удалось открыть файл [%s] !\n', File_Path);
    ErrCode = -1;
    return;
end

% Создание матриц перехода для преобразования векторных результатов
Conversion_Matrices = [];
Conversion_Matrix_Index = [];

if (~isempty(Coordinate_Systems))
    
    Conversion_Matrices = cell(size(Coordinate_Systems, 1), 1);
    
    for i=1:size(Conversion_Matrices, 1)
        
        Conversion_Matrices{i} = zeros(3,3);
        
        e_1 = Coordinate_Systems{i}.Point_On_Axis_1 - Coordinate_Systems{i}.Origin;
        e_1 = e_1 / norm(e_1);
        
        e_3 = cross(e_1, Coordinate_Systems{i}.Point_On_Plane_12 - Coordinate_Systems{i}.Origin);
        e_3 = e_3 / norm(e_3);
        
        e_2 = cross(e_3, e_1);
        e_2 = e_2 / norm(e_2);
        
        Conversion_Matrices{i}(:,1) = e_1;
        Conversion_Matrices{i}(:,2) = e_2;
        Conversion_Matrices{i}(:,3) = e_3;
        
    end
    
    Conversion_Matrix_Index = zeros(size(ELEMENTS,1),1);

    for i=1:size(ELEMENTS,1)

        switch ELEMENTS(i,4)

            case 5
                fprintf (1, '\nОшибка функции Read_Dat_File_Therm: необходимо дописать код!\n');
                ErrCode = -1;
                fclose(Fin);
                return;

            otherwise
                fprintf (1, '\nОшибка функции Read_Dat_File_Therm: необходимо дописать код!\n');
                ErrCode = -1;
                fclose(Fin);
                return;

        end

    end
    
end

% Подготовка массивов для хранения результатов
N_PT = zeros(size(ELEMENTS,1),1);
Results_Thermal = cell(3,1);
Flags_Array = cell(3,1);

for i=1:3
    
    Results_Thermal{i} = cell(size(ELEMENTS,1),1);
    Flags_Array{i} = cell(size(ELEMENTS,1),1);
    
end

for i=1:size(ELEMENTS,1)
    
    switch ELEMENTS(i,2)
        
        case 2
            
            fprintf (1, '\nОшибка функции Read_Dat_File_Therm: обнаружен 2D элемент!\n');
            ErrCode = -1;
            fclose(Fin);
            return;
            
        case 3
            
            switch ELEMENTS(i,3)
                
                case 6
                    N_PT(i) = 6;
                    
                case 8
                    N_PT(i) = 8;
                    
                case 15
                    N_PT(i) = 18;
                    
                case 20
                    N_PT(i) = 27;
                
            end
        
    end
    
end

for i=1:size(ELEMENTS,1)
    
    for j=1:3
        
        Results_Thermal{j}{i} = zeros(N_PT(i), 4);
        Flags_Array{j}{i} = zeros(N_PT(i), 1);
        
    end
    
end

% Просмотр файла
Step_Number = [];

while (~feof(Fin))
    
    % Чтение следующей строки
    string = fgets(Fin);
    
    % Чтение номера шага
    position_2 = strfind(string, 'S T E A D Y   S T A T E   H E A T   T R A N S F E R');
    
    if (~isempty(position_2))
        
        position_1 = strfind(string, 'S T E P');
        
        if (isempty(position_1))
            fprintf (1, '\nОшибка 1 чтения файла [%s] !\n', File_Path);
            ErrCode = -1;
            fclose(Fin);
            return;
        end
        
        Step_Number = str2double(string(position_1+7:position_2-1));
        
        if (Step_Number > 3)
            fprintf (1, '\nОшибка 2 чтения файла [%s] !\n', File_Path);
            ErrCode = -1;
            fclose(Fin);
            return;
        end
        
    end
    
    % Начало таблицы
    if (~isempty(strfind(string, 'ELEMENT  PT FOOT-'))) %#ok<STREMP>
        
        if (isempty(Step_Number))
            fprintf (1, '\nОшибка 3 чтения файла [%s] !\n', File_Path);
            ErrCode = -1;
            fclose(Fin);
            return;
        end
        
        temp_cell_array = strsplit(strtrim(string), {' ', '\t'});
        
        if (isempty(temp_cell_array) || (numel(temp_cell_array) ~= 8))
            fprintf (1, '\nОшибка 4 чтения файла [%s] !\n', File_Path);
            ErrCode = -1;
            fclose(Fin);
            return;
        end
        
        if (~strcmp(temp_cell_array{1}, 'ELEMENT'))
            fprintf (1, '\nОшибка 5 чтения файла [%s] !\n', File_Path);
            ErrCode = -1;
            fclose(Fin);
            return;
        end
        
        if (~strcmp(temp_cell_array{2}, 'PT'))
            fprintf (1, '\nОшибка 6 чтения файла [%s] !\n', File_Path);
            ErrCode = -1;
            fclose(Fin);
            return;
        end
        
        if (~strcmp(temp_cell_array{3}, 'FOOT-'))
            fprintf (1, '\nОшибка 7 чтения файла [%s] !\n', File_Path);
            ErrCode = -1;
            fclose(Fin);
            return;
        end
        
        Table_Ind = zeros(4,1);
        
        for i=1:numel(temp_cell_array)
            
            switch temp_cell_array{i}
                
                case 'HFL1'
                    Table_Ind(1) = i;
                    
                case 'HFL2'
                    Table_Ind(2) = i;
                    
                case 'HFL3'
                    Table_Ind(3) = i;
                    
                case 'IVOL'
                    Table_Ind(4) = i;
                
            end
            
        end
        
        for i=1:numel(Table_Ind)
            if (Table_Ind(i) == 0)
                fprintf (1, '\nОшибка 8 чтения файла [%s] !\n', File_Path);
                ErrCode = -1;
                fclose(Fin);
                return;
            end
        end
        
        string = fgets(Fin); %#ok<NASGU>
        string = fgets(Fin); %#ok<NASGU>
        
        while (~feof(Fin))
            
            string = fgets(Fin);
            
            if (isempty(strtrim(string)))
                break;
            end
            
            temp_cell_array = strsplit(strtrim(string), {' ', '\t'});
            
            if (isempty(temp_cell_array) || (~((numel(temp_cell_array) == 7) || (numel(temp_cell_array) == 8))))
                fprintf (1, '\nОшибка 9 чтения файла [%s] !\n', File_Path);
                ErrCode = -1;
                fclose(Fin);
                return;
            end
            
            switch numel(temp_cell_array)
                
                case 7
                    
                    EL = str2double(temp_cell_array{1});
                    
                    if (isnan(EL))
                        fprintf (1, '\nОшибка 10 чтения файла [%s] !\n', File_Path);
                        ErrCode = -1;
                        fclose(Fin);
                        return;
                    end
                    
                    PT = str2double(temp_cell_array{2});
                    
                    if (isnan(PT))
                        fprintf (1, '\nОшибка 11 чтения файла [%s] !\n', File_Path);
                        ErrCode = -1;
                        fclose(Fin);
                        return;
                    end
                    
                    HFL1 = str2double(temp_cell_array{Table_Ind(1)-1});
                    
                    if (isnan(HFL1))
                        fprintf (1, '\nОшибка 12 чтения файла [%s] !\n', File_Path);
                        ErrCode = -1;
                        fclose(Fin);
                        return;
                    end
                    
                    HFL2 = str2double(temp_cell_array{Table_Ind(2)-1});
                    
                    if (isnan(HFL2))
                        fprintf (1, '\nОшибка 13 чтения файла [%s] !\n', File_Path);
                        ErrCode = -1;
                        fclose(Fin);
                        return;
                    end
                    
                    HFL3 = str2double(temp_cell_array{Table_Ind(3)-1});
                    
                    if (isnan(HFL3))
                        fprintf (1, '\nОшибка 14 чтения файла [%s] !\n', File_Path);
                        ErrCode = -1;
                        fclose(Fin);
                        return;
                    end
                    
                    IVOL = str2double(temp_cell_array{Table_Ind(4)-1});
                    
                    if (isnan(IVOL))
                        fprintf (1, '\nОшибка 15 чтения файла [%s] !\n', File_Path);
                        ErrCode = -1;
                        fclose(Fin);
                        return;
                    end
                    
                    if (EL > size(ELEMENTS,1))
                        fprintf (1, '\nОшибка 16 чтения файла [%s] !\n', File_Path);
                        ErrCode = -1;
                        fclose(Fin);
                        return;
                    end
                    
                    if (PT > N_PT(EL))
                        fprintf (1, '\nОшибка 17 чтения файла [%s] !\n', File_Path);
                        ErrCode = -1;
                        fclose(Fin);
                        return;
                    end
                    
                    if (Flags_Array{Step_Number}{EL}(PT) == 1)
                        fprintf (1, '\nОшибка 18 чтения файла [%s] !\n', File_Path);
                        ErrCode = -1;
                        fclose(Fin);
                        return;
                    end
                    
                    Results_Thermal{Step_Number}{EL}(PT,1) = HFL1;
                    Results_Thermal{Step_Number}{EL}(PT,2) = HFL2;
                    Results_Thermal{Step_Number}{EL}(PT,3) = HFL3;
                    Results_Thermal{Step_Number}{EL}(PT,4) = IVOL;
                    
                    Flags_Array{Step_Number}{EL}(PT) = 1;
                    
                case 8
                    
                    if (~strcmp(temp_cell_array{3}, 'OR'))
                        fprintf (1, '\nОшибка 19 чтения файла [%s] !\n', File_Path);
                        ErrCode = -1;
                        fclose(Fin);
                        return;
                    end
                    
                    EL = str2double(temp_cell_array{1});
                    
                    if (isnan(EL))
                        fprintf (1, '\nОшибка 20 чтения файла [%s] !\n', File_Path);
                        ErrCode = -1;
                        fclose(Fin);
                        return;
                    end
                    
                    PT = str2double(temp_cell_array{2});
                    
                    if (isnan(PT))
                        fprintf (1, '\nОшибка 21 чтения файла [%s] !\n', File_Path);
                        ErrCode = -1;
                        fclose(Fin);
                        return;
                    end
                    
                    HFL1 = str2double(temp_cell_array{Table_Ind(1)});
                    
                    if (isnan(HFL1))
                        fprintf (1, '\nОшибка 22 чтения файла [%s] !\n', File_Path);
                        ErrCode = -1;
                        fclose(Fin);
                        return;
                    end
                    
                    HFL2 = str2double(temp_cell_array{Table_Ind(2)});
                    
                    if (isnan(HFL2))
                        fprintf (1, '\nОшибка 23 чтения файла [%s] !\n', File_Path);
                        ErrCode = -1;
                        fclose(Fin);
                        return;
                    end
                    
                    HFL3 = str2double(temp_cell_array{Table_Ind(3)});
                    
                    if (isnan(HFL3))
                        fprintf (1, '\nОшибка 24 чтения файла [%s] !\n', File_Path);
                        ErrCode = -1;
                        fclose(Fin);
                        return;
                    end
                    
                    IVOL = str2double(temp_cell_array{Table_Ind(4)});
                    
                    if (isnan(IVOL))
                        fprintf (1, '\nОшибка 25 чтения файла [%s] !\n', File_Path);
                        ErrCode = -1;
                        fclose(Fin);
                        return;
                    end
                    
                    if (EL > size(ELEMENTS,1))
                        fprintf (1, '\nОшибка 26 чтения файла [%s] !\n', File_Path);
                        ErrCode = -1;
                        fclose(Fin);
                        return;
                    end
                    
                    if (PT > N_PT(EL))
                        fprintf (1, '\nОшибка 27 чтения файла [%s] !\n', File_Path);
                        ErrCode = -1;
                        fclose(Fin);
                        return;
                    end
                    
                    if (Flags_Array{Step_Number}{EL}(PT) == 1)
                        fprintf (1, '\nОшибка 28 чтения файла [%s] !\n', File_Path);
                        ErrCode = -1;
                        fclose(Fin);
                        return;
                    end
                    
                    if (isempty(Conversion_Matrices))
                        fprintf (1, '\nОшибка 29 чтения файла [%s] !\n', File_Path);
                        ErrCode = -1;
                        fclose(Fin);
                        return;
                    end
                    
                    if (Conversion_Matrix_Index(EL) == 0)
                        fprintf (1, '\nОшибка 30 чтения файла [%s] !\n', File_Path);
                        ErrCode = -1;
                        fclose(Fin);
                        return;
                    end
                    
                    Rotated_HFL = Conversion_Matrices{Conversion_Matrix_Index(EL)} * [HFL1; HFL2; HFL3];
                    
                    Results_Thermal{Step_Number}{EL}(PT,1) = Rotated_HFL(1);
                    Results_Thermal{Step_Number}{EL}(PT,2) = Rotated_HFL(2);
                    Results_Thermal{Step_Number}{EL}(PT,3) = Rotated_HFL(3);
                    Results_Thermal{Step_Number}{EL}(PT,4) = IVOL;
                    
                    Flags_Array{Step_Number}{EL}(PT) = 1;
                
            end
            
        end
        
    end
    
end

% Проверка флагов
for i=1:3
    
    for j=1:size(ELEMENTS,1)
        
        for k=1:N_PT(j)
            
            if (Flags_Array{i}{j}(k) == 0)
                fprintf (1, '\nОшибка 31 чтения файла [%s] !\n', File_Path);
                ErrCode = -1;
                fclose(Fin);
                return;
            end
            
        end
        
    end
    
end

% Закрытие файла
fclose(Fin);
